;(async function () {
  // 搭建express服务
  const express = require('express')
  // 引入路由器中间件
  const router = require('./router')

  // 导入连接数据库的代码
  const db = require('./db/connect')

  // 引入cooki-parser
  const cookieParser = require('cookie-parser')
  // 引入处理session的中间件
  const session = require('express-session')
  // 引入将session数据存储到数据库的包
  const MongoStore = require('connect-mongo')(session)
  try {
    await db
    console.log('数据库连接成功了')
  } catch (error) {
    console.log('数据库连接失败了')
    return
  }

  const app = express()

  app.set('view engine', 'ejs') //告诉express.要使用ejs模板引擎
  app.set('views', './templates') // 告诉express. 模板存放在哪里

  // 处理所有静态资源的中间件
  // app.use(express.static('静态资源所存放的路径'))
  // 这个express.static中间件的使用规则:
  // 1. 只有路径中以后缀名结尾才认为是要获取静态资源,才会被这个中间件处理
  // http://localhost:5000/login -->不会被这个中间件处理
  // http://localhost:5000/login.html -> 才会被这个中间件处理
  // 2. 这个中间件查找文件的方式
  // http://localhost:5000/login.html -> express.static中间件就会直接在view目录下找login.html
  // http://localhost:5000/aaa/login.html -> express.static中间件就会在view目录下线找aaa目录,然后在aaa目录下找login.html

  // http://localhost:5000/x/y/z.css -> 去view目录下线找x目录,然后在x目录下,找y目录,然后在y目录下找z.css
  app.use(express.static('./view'))

  // 处理post请求数据的中间件
  app.use(express.urlencoded({ extended: false }))

  //使用解析cookie的中间件
  app.use(cookieParser())

  app.use(
    session({
      name: 'xxx', //设置cookie的name，默认值是：connect.sid
      secret: 'atguigu', //参与加密的字符串（又称签名）
      saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
      resave: true, //是否在每次请求时，强制重新保存session，即使他们没有变化
      store: new MongoStore({
        url: 'mongodb://localhost:27017/sessions_container',
        touchAfter: 24 * 3600, //修改频率（例：//在24小时之内只更新一次）
      }),
      cookie: {
        httpOnly: false, // 开启后前端无法通过 JS 操作cookie
        maxAge: 1000 * 30 * 60, // 设置cookie的过期时间
      },
    })
  )

  // 使用路由器中间件
  app.use(router)

  app.listen(5000, (err) => {
    if (err) console.log('fail')
    else console.log('ok')
  })
})()
